/**
 * 在编程中，常量是在程序执行期间不会改变的值。
 * 
 * C++ 支持两种不同类型的常量：
 *   命名常量是与标识符关联的常量值。这些有时也称为符号常量，有时简称为常量。
 *   文字常量是与标识符无关的常量值。
 * 
 * 定义命名常量有三种方法：
 *   常量变量
 *   带有替换文本的类似对象的宏 
 *   枚举常量
 * 
 * 声明 const 变量
 *   要声明常量变量，我们将const关键字（称为“const 限定符”）放置在对象类型旁边
 * 
 * 由于编译器解析更复杂声明的方式，一些开发人员更喜欢将 放在const类型后面（因为它稍微更一致）。
 * 这种风格被称为“east const”。虽然这种风格有一些拥护者（以及一些合理的观点），但它并没有明显流行起来。
 * 
 * 最佳实践
 *   放在const类型之前（因为这样做更传统）。
 * 
 * 
 * const 变量必须初始化
 * const 变量必须在定义时初始化，然后该值不能通过赋值来更改
 * 
 * 常量函数参数
 *   函数参数可以通过关键字设置为常量const
 * 
 * 最佳实践
 *   const按值传递时不要使用。
 * 
 * 常量返回值
 *   函数的返回值也可以设为 const
 * 
 * 最佳实践
 *   const按值返回时不要使用。
 * 
 * 优先选择常量变量而不是预处理器宏
 * 
 * 类型限定符
 *   const volatile
 * 
 */

#include <iostream>

// 带有替换文本的类似对象的宏 （可以使用常量变量替代）
#define MY_NAME "Alex"

// 常量函数参数
void printInt(const int x)
{
    std::cout << x << '\n';
}

// 常量返回值
const int getValue()
{
    return 5;
}

int main() {
    const double gravity { 9.8 };  // preferred use of const before type
    int const sidesInSquare { 4 }; // "east const" style, okay but not preferred

    std::cout << "Enter your age: ";
    int age{};
    std::cin >> age;

    const int constAge { age }; // initialize const variable using non-const value

    age = 5;      // ok: age is non-const, so we can change its value
    // constAge = 6; // error: constAge is const, so we cannot change its value

    return 0;
}